// 文件名：queue_io_submission.cpp
// 目的：用两个 std::queue 模拟 I/O 提交队列与完成队列的工作流（提交->处理->完成轮询）。
// 模型：
//   - submissionQueue：用户态提交 IORequest；
//   - completionQueue：处理后生成 IOCompletion；
//   - 处理环节用随机分布模拟成功/失败，并输出提交与完成日志；
//   - 用户态最后轮询完成队列，读取并消费结果。
// 复杂度：线性 O(N)；每次 push/pop 均摊 O(1)。
// 注意：示例为单线程模型；真实系统中提交与完成通常由不同线程/中断驱动（需同步/无锁结构）。
#include <chrono>
#include <iostream>
#include <queue>
#include <random>
#include <string>

struct IORequest {
    int id;
    std::string payload;
};

struct IOCompletion {
    int id;
    bool success;
};

int main() {
    std::queue<IORequest> submissionQueue;
    std::queue<IOCompletion> completionQueue;

    // 提交 5 个 I/O 请求
    for (int i = 1; i <= 5; ++i) {
        submissionQueue.push(IORequest{i, "payload-" + std::to_string(i)});
    }

    std::mt19937 rng{std::random_device{}()};
    std::bernoulli_distribution okDist(0.85);

    // 模拟内核处理：将提交队列中的请求转换为完成事件
    while (!submissionQueue.empty()) {
        IORequest req = submissionQueue.front();
        submissionQueue.pop();

        bool ok = okDist(rng);
        std::cout << "Submit IO#" << req.id << " (" << req.payload << ")\n";
        completionQueue.push(IOCompletion{req.id, ok});
    }

    // 用户态轮询完成队列
    while (!completionQueue.empty()) {
        IOCompletion comp = completionQueue.front();
        completionQueue.pop();
        std::cout << "Complete IO#" << comp.id
                  << " -> " << (comp.success ? "OK" : "FAIL") << '\n';
    }

    return 0;
}